package net.thxjj.mobileServer.util;
import com.sun.mail.util.MailSSLSocketFactory;

import java.security.GeneralSecurityException;
import java.util.Properties;
import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.Address;
import javax.mail.BodyPart;
import javax.mail.Message;
import javax.mail.Multipart;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;

public class SendMail {
	 private MimeMessage mimeMsg; //MIME邮件对象
	    private Session session; //邮件会话对象
	    private Properties props; //系统属性   
	    private boolean needAuth = false; //smtp是否需要认证   
	    //smtp认证用户名和密码   
	    private String username;   
	    private String password;   
	    private Multipart mp; //Multipart对象,邮件内容,标题,附件等内容均添加到其中后再生成MimeMessage对象
	       
	    /** 
	     * Constructor 
	     * @param smtp 邮件发送服务器 
	     */  
	    public SendMail(String smtp){   
	        setSmtpHost(smtp);   
	        createMimeMessage();   
	    }   
	  
	    /** 
	     * 设置邮件发送服务器 
	     * @param hostName String  
	     */  
	    public void setSmtpHost(String hostName) {
	        System.out.println("设置系统属性：mail.smtp.host = "+hostName);   
	        if(props == null)  
	            props = System.getProperties(); //获得系统属性对象    
	        props.put("mail.smtp.host",hostName); //设置SMTP主机
//开启SSL加密
//			MailSSLSocketFactory sf = null;
//			try {
//				sf = new MailSSLSocketFactory();
//				sf.setTrustAllHosts(true);
//				props.put("mail.smtp.ssl.socketFactory", sf);
//			} catch (GeneralSecurityException e) {
//				e.printStackTrace();
//			}
//			props.put("mail.smtp.ssl.enable", "true");
//			props.put("mail.smtp.port", "587");//设置端口
//			props.put("mail.smtp.socketFactory.port", "587");//设置ssl端口
	    }   
	  
	  
	    /** 
	     * 创建MIME邮件对象   
	     * @return 
	     */  
	    public boolean createMimeMessage()   
	    {   
	        try {   
	            System.out.println("准备获取邮件会话对象！");   
	            session = Session.getDefaultInstance(props,null); //获得邮件会话对象   
	        }   
	        catch(Exception e){   
	            System.err.println("获取邮件会话对象时发生错误！"+e);   
	            return false;   
	        }   
	      
	        System.out.println("准备创建MIME邮件对象！");   
	        try {   
	            mimeMsg = new MimeMessage(session); //创建MIME邮件对象   
	            mp = new MimeMultipart();   
	          
	            return true;   
	        } catch(Exception e){   
	            System.err.println("创建MIME邮件对象失败！"+e);   
	            return false;   
	        }   
	    }     
	      
	    /** 
	     * 设置SMTP是否需要验证 
	     * @param need 
	     */  
	    public void setNeedAuth(boolean need) {   
	        System.out.println("设置smtp身份认证：mail.smtp.auth = "+need);   
	        if(props == null) props = System.getProperties();   
	        if(need){   
	            props.put("mail.smtp.auth","true");   
	        }else{   
	            props.put("mail.smtp.auth","false");   
	        }   
	    }   
	  
	    /** 
	     * 设置用户名和密码 
	     * @param name 
	     * @param pass 
	     */  
	    public void setNamePass(String name,String pass) {   
	        username = name;   
	        password = pass;   
	    }   
	  
	    /** 
	     * 设置邮件主题 
	     * @param mailSubject 
	     * @return 
	     */  
	    public boolean setSubject(String mailSubject) {   
	        System.out.println("设置邮件主题！");   
	        try{   
	            mimeMsg.setSubject(mailSubject);   
	            return true;   
	        }   
	        catch(Exception e) {   
	            System.err.println("设置邮件主题发生错误！");   
	            return false;   
	        }   
	    }  
	      
	    /**  
	     * 设置注册时邮件正文
	     *
	     */   
	    public boolean setRegisterBody(String code) {
	        try{

	        	String de = "<div class=\"container\">\n" +
						"                <div class=\"hero-desc\">\n" +
						"                    <div class=\"row\">\n" +
						"                        <div class=\"col-md-12\">\n" +
						"                            <h2>欢迎您注册app,您的邮箱验证码为:"+code+",请在30分钟内完成注册</h2>\n" +
						"                        </div>\n" +
						"                    </div>\n" +
						"                </div>\n" +
						"            </div>";

	            BodyPart bp = new MimeBodyPart();   
	            bp.setContent(""+de,"text/html;charset=GBK");
	            mp.addBodyPart(bp);   
	          
	            return true;   
	        } catch(Exception e){   
	        System.err.println("设置邮件正文时发生错误！"+e);   
	        return false;   
	        }   
	    }


	/**
	 * 设置重置密码时邮件正文
	 *
	 */
	public boolean setResetBody(String code) {
		try{

			String de = "<div class=\"container\">\n" +
					"                <div class=\"hero-desc\">\n" +
					"                    <div class=\"row\">\n" +
					"                        <div class=\"col-md-12\">\n" +
					"                            <h2>欢迎您重置此账号密码,您的邮箱验证码为:"+code+",请在30分钟内完成密码重置</h2>\n" +
					"                        </div>\n" +
					"                    </div>\n" +
					"                </div>\n" +
					"            </div>";

			BodyPart bp = new MimeBodyPart();
			bp.setContent(""+de,"text/html;charset=GBK");
			mp.addBodyPart(bp);

			return true;
		} catch(Exception e){
			System.err.println("设置邮件正文时发生错误！"+e);
			return false;
		}
	}
	/**
	     * 添加附件 
	     * @param filename String  
	     */   
	    public boolean addFileAffix(String filename) {   
	      
	        System.out.println("增加邮件附件："+filename);   
	        try{   
	        	BodyPart bp = new MimeBodyPart();   
	 	        FileDataSource fileds = new FileDataSource(filename);   
	 	        bp.setDataHandler(new DataHandler(fileds));   
	 	        bp.setFileName(fileds.getName());   
	 	              
	 	        mp.addBodyPart(bp); 
	 	        return true;  
 	        } catch(Exception e){   
 	            System.err.println("增加邮件附件："+filename+"发生错误！"+e);   
 	            return false;   
 	        }   
	    }   
	      
	    /**  
	     * 设置发信人 
	     * @param from String  
	     */   
	    public boolean setFrom(String from) {   
	        System.out.println("设置发信人！");   
	        try{   
	            mimeMsg.setFrom(new InternetAddress(from)); //设置发信人   
	            return true;   
	        } catch(Exception e) {   
	            return false;   
	        }   
	    }   
	    /**  
	     * 设置收信人 
	     * @param to String  
	     */   
	    public boolean setTo(String to){   
	        if(to == null)return false;   
	        try{   
	            mimeMsg.setRecipients(Message.RecipientType.TO,InternetAddress.parse(to));   
	            return true;   
	        } catch(Exception e) {   
	            return false;   
	        }     
	    }   
	      
	    /**  
	     * 设置抄送人 
	     * @param copyto String   
	     */   
	    public boolean setCopyTo(String copyto)   
	    {   
	        if(copyto == null)return false;   
	        try{   
	        mimeMsg.setRecipients(Message.RecipientType.CC,(Address[])InternetAddress.parse(copyto));   
	        return true;   
	        }   
	        catch(Exception e)   
	        { return false; }   
	    }   
	      
	    /**  
	     * 发送邮件 
	     */   
	    public boolean sendOut()   
	    {   
	        try{   
	            mimeMsg.setContent(mp);   
	            mimeMsg.saveChanges();   
	            System.out.println("正在发送邮件....");   
	              
	            Session mailSession = Session.getInstance(props,null);   
	            Transport transport = mailSession.getTransport("smtp");   
	            transport.connect((String)props.get("mail.smtp.host"),username,password);   
	            transport.sendMessage(mimeMsg,mimeMsg.getRecipients(Message.RecipientType.TO));   
	            //transport.sendMessage(mimeMsg,mimeMsg.getRecipients(Message.RecipientType.CC));   
	            //transport.send(mimeMsg);   
	              
	            System.out.println("发送邮件成功！");   
	            transport.close();   
	              
	            return true;   
	        } catch(Exception e) {   
	            System.err.println("邮件发送失败！"+e);   
	            return false;   
	        }   
	    }

	public static boolean send(String smtp,String from,String to,String subject,String code,String username,String password,int type) {
		SendMail theMail = new SendMail(smtp);
		theMail.setNeedAuth(true); //需要验证

		if(!theMail.setSubject(subject)) return false;
		if(type==1){
			if(!theMail.setRegisterBody(code)) return false;
		}else{
			if(!theMail.setResetBody(code)) return false;
		}
		if(!theMail.setTo(to)) return false;
		if(!theMail.setFrom(from)) return false;
		theMail.setNamePass(username,password);

		if(!theMail.sendOut()) return false;
		return true;
	}

	    
	    public static void main(String[] args){  
	    	String smtp = "smtp.sina.com";  
		    String from = "duckstime@sina.com";
		    String to = "546342804@qq.com,2873135184@qq.com,tracyhenryduck2@sina.com,tracyhenryduck3@sina.com,tracyhenryduck4@sina.com,tracyhenryduck@gmail.com";
		    String subject = "SiterWell验证码";
		    String username="duckstime@sina.com";  
		    String password="6e4926319f1a0923";
		    SendMail.send(smtp, from, to, subject,"123456", username, password,1);
		}
}
